import * as bcrypt from 'bcryptjs'; // 引入 bcryptjs 库
import type { User } from "../../types"; // 假设 User 类型是 { id: any; username: string; }
import type { D1Database } from '@cloudflare/workers-types';
import _ from 'lodash';

/**
 * 验证用户登录 (使用 bcrypt)
 * @param {D1Database} db D1数据库实例
 * @param {string} username 用户名
 * @param {string} plaintextPassword 用户提供的明文密码
 * @returns {Promise<User|null>} 用户信息或null
 */
export async function validateUser(db: D1Database, username: string, plaintextPassword: string): Promise<User | null> {
  if (!db) {
    console.error("D1 Database binding is not available.");
    throw new Error("Database not available");
  }
  try {
    // 'password' 列存储的是 bcrypt 哈希过的密码
    const stmt = db.prepare(
      "SELECT * FROM users WHERE username = ?1"
    );

    // 定义一个接口来匹配从数据库查询出来的带有哈希密码的完整用户记录
    interface UserRecordWithHash extends User {
      password: string;
    }
    
    const userRecord = await stmt.bind(username).first<UserRecordWithHash>();
    // console.log(bcrypt.hashSync('admin', 10));
    
    if (!userRecord || !userRecord.password) {
      // 用户不存在或数据库中没有存储密码哈希
      console.warn(`用户 ${username} 不存在或密码未设置。`);
      return null;
    }

    // 使用 bcrypt.compare 异步比较提供的明文密码和存储的哈希密码
    const passwordMatch = await bcrypt.compare(plaintextPassword, userRecord.password);
    
    if (passwordMatch) {
      // 密码匹配，返回用户信息 (不包括密码哈希)
      // 确保返回的对象结构符合 User 类型
      return _.omit(userRecord, ['password']);
    } else {
      // 密码不匹配
      console.warn(`用户 ${username} 密码验证失败。`);
      return null;
    }
  } catch (error) {
    console.error("验证用户时发生错误:", error);
    return null; // 或者根据错误类型进行更具体的处理
  }
}

// getDbConnection 和 closeDbConnection 不再需要，因为 D1 实例由 Cloudflare Workers 环境管理
